﻿using System;
using System.Collections.Generic;

namespace _30._1_csharp_索引器
{
    class Program
    {
        static void Main(string[] args)
        {
            // son : 儿子、mom 妈妈、wife ：妻子
            var i = new PersonV2("张三", "社畜");
            var son = new PersonV2("张四", "小祖宗");
            var mom = new PersonV2("李四", "亲娘哎");
            var wife = new PersonV2("王五", "领导");

            // i["xxx"] = son;
            i.Add(son);
            i.Add(mom);
            i.Add(wife);

            try
            {
                //string key = "领导";
                string key = "祖宗";
                Console.WriteLine($"{i} 家的 {key} 是 {i[key]}");
            }
            catch (Exception e)
            {
                Console.WriteLine($"数据获取失败，{e}");
            }
        }
    }

    // 索引器不必根据整数值类型进行索引，由你决定查找机制
    //  索引器可以被重载
    //  索引器可以有多个形参，如访问二维数组时

    // 通过索引器可以取 List (Array)的值
    class Person
    {
        // 昵称
        private string nickname;

        private string name;
        private List<Person> people;

        public Person(string name, string nickname)
        {
            this.name = name;
            this.nickname = nickname;
            people = new List<Person>();
        }

        public void Add(Person person) => people.Add(person);


        // key :键值，钥匙 ，字典常用概念
        // 返回值可以自己定义，本例测试了 string、Person 、this
        //public string this[string key]
        //public object this[string key]
        public Person this[string nickname]
        {
            get
            {
                // lambda 表达式 
                var pr = people.Find(v => v.nickname == nickname);
                return pr;
            }
            // 课后，自己补充 set ，同时把上面 add 方法的调用改为使用索引器赋值
        }

        public override string ToString() => name;
    }


    // 通过索引器可以取字典的值
    class PersonV2
    {
        // 昵称
        public string nickname;
        private string name;
        private Dictionary<string, PersonV2> people;

        public PersonV2(string name, string nickname)
        {
            this.name = name;
            this.nickname = nickname;
            people = new Dictionary<string, PersonV2>();
        }

        public void Add(PersonV2 person)
        {
            people.Add(person.nickname, person);
        }

        // key :键值，钥匙 ，字典常用概念
        // 返回值可以自己定义，本例测试了 string、Person 、this
        //public string this[string key]
        //public object this[string key]
        public PersonV2 this[string nickname]
        {
            get
            {
                // trygetvalue
                // try :尝试
                // get : 得到
                // value :值
                if (!people.TryGetValue(nickname, out var p))
                {
                    Console.WriteLine($"昵称 {nickname} 未找到匹配的人");
                }
                return p;

                //try
                //{
                //    var pr = people[nickname];
                //    return pr;
                //}
                //catch (Exception e)
                //{
                //    throw e;
                //}
            }
            //课后补全 set
        }

        public override string ToString() => name;
    }
}
